package org.ccay.core.registry;

import java.text.DateFormat;
import java.text.ParseException;
import java.util.Date;
import java.util.List;

import org.ccay.core.exception.ApplicationException;

public interface IRegistryManager {
	
	/**
	 * 装载注册项
	 */
	public void load();
	
	/**
	 * 重新装载指定名册的注册项（值）
	 * @param registryItemName
	 */
	public void reload(String registryItemName);
	
	/**
	 * 重新装载注册项
	 */
	public void reload();
	
	/**
	 * 清除注册项
	 */
	public void clear();
	
	/**
	 * 创建注册项并之久化
	 * 创建注册项通常有两个目的
	 * 1、覆盖已有的从jar包中已加载的注册项，提供新值，已实现非停机更新注册项
	 * 2、某些注册项没有在jar包的xml文件中配置，进而添加。
	 * 总之：只有在非停机情况下修改注册表项时，你才需要调用此方法。
	 * 如果你可以停机重新装载，则请在xml文件中配置（推荐）
	 * 此方法会刷新JVM缓存（集群环境需要刷每个机器的缓存）
	 * @param item
	 * @throws ApplicationException 
	 */
	public void createOrUpdateRegistryItem(RegistryItem item) throws ApplicationException;
	
	/**
	 * 删除注册项
	 * 对于某些只读注册项（例如从jar包中加载的注册项）来说什么都不做
	 * 对于从数据库中加载的注册项执行删除操作
	 * 此方法会刷新JVM缓存（集群环境需要刷每个机器的缓存）
	 * @param item
	 */
	public void deleteRegistryItem(String name) throws ApplicationException;
	
	/**
	 * 获取所有注册项
	 */
	public List<RegistryItem> getAll();
	
	/**
	 * 是否存在给定名称的注册项
	 * @param name
	 * @return
	 */
	public boolean hasRegistryItem(String name);
	
	/**
	 * 获取给定名称的注册项
	 * @param name
	 * @return
	 */
	public RegistryItem get(String name);

	/**
	 * 获取值
	 * @param name
	 * @return
	 */
	String getValue(String name);
	
	
	/**
	 * 获取值
	 * @param name
	 * @return
	 */
	Long getLongValue(String name);
	
	/**
	 * 获取值 
	 * @param name
	 * @return
	 */
	Double getDoubleValue(String name);
	
	/**
	 * 获取值
	 * @param name
	 * @return
	 */
	Boolean getBooleanValue(String name);
	
	/**
	 * 获取值
	 * @param name
	 * @param dataformat
	 * @return
	 * @throws ParseException
	 */
	Date getDateValue(String name,DateFormat dataformat) throws ParseException;

	/**
	 * 获取值
	 * @param string
	 * @return
	 */
	Integer getIntegerValue(String string);
}
